Trojan source
実際に実行されるコードとエディタに表示されるコードを食い違わせる攻撃手法
複数の攻撃手法がレポートされている
1. 文字の順序が入れ替わるunicode制御文字を使う
関数の呼び出し先が変わったり、条件式の結果が反転したりする
見た目は同じだがcodepointが異なるアルファベット
これも関数の呼び出し先を変えたり、条件式の結果を反転させたりできる
原理的には全てのプログラム言語で実現可能
攻撃対象
if文や早期return、コメントアウト
他人の書いたコードが入ってくるインフラ
pull requestやpatchなど
しくみ
文字の順序が入れ替わる
U+202E
https://gyazo.com/9d08dfc348e529861100426cb6f965fe
ブラウザのタイトルバーや本文も、この文字を解説しただけで影響を受けている
U+2066
U+2069
例:見た目に反してコメントアウトされているif文
if文の部分はコメントアウトされていない様に見えるが、実際にはコメントアウトされている
VSCodeやemacsだとこんな感じ
https://gyazo.com/6aaa9271a6cacbce93c63614035b2e0e
正しくuncode対応していると、逆にこうなってしまう
Scrapboxでの対策
Trojan sourceに使われる文字を可視化した
code:commenting-out.js
var isAdmin = false;
/* } if (isAdmin) begin admins only */
console.log("You are an admin.");
/* end admins only { */
例:if文が成立しそうで実はしない
code:stretch-string.js
var accessLevel = "user";
if (accessLevel != "user // Check if admin ") {
console.log("You are an admin.");
}
code:invisible-function.js
function isAdmin() {
return false;
}
function isAdmin() {
return true;
}
if (isAdmin()) {
console.log("You are an admin\n");
} else {
console.log("You are NOT an admin.\n");
}
例:見た目は同じだがcodepointが違うアルファベット
code:homoglyph-function.js
function sayHello() {
console.log("Hello, World!\n");
}
function sayНello() {
console.log("Goodbye, World!\n");
}
sayНello();
HがU+41dになっている
https://gyazo.com/ba338ac11fa9bbeac4097d7988acca12
対策
表示順序を制御する文字をそのまま描画しない
https://nota.gyazo.com/ea4bcde503a46cd8d989cd538a20dcdb